package com.iamteer.day14;
/**
有一个水池，容量是 500L，一边为进水口，一边是出水口，但进水出水不能同时进行。
水池一量满了不能继续注水，一量空了不能继续放水。
进水速度 5L/s，放水速度 2L/s

 */

//水池对象
class Pool{
	public static final int CAPACITY = 500;	//水池容量
	int waterLevel = 0;						//当前水位
	
	//水池是否已满
	public boolean isFull(){				
		if (waterLevel == CAPACITY) {
			return true;
		}else{
			return false;
		}
	}
	
	//水池是否已空
	public boolean isEmpty(){				
		if (waterLevel == 0) {
			return true;
		}else{
			return false;
		}
	}
}

//注水进程对象
class Input extends Thread{
	public static final int inSpeed = 5;	//注水速度
	public Pool pool;	//注水的水池对象
	
	//构造函数，指定水池
	public Input(Pool pool){
		this.pool = pool;
	}
	
	@Override
	public void run() {	//定义注水进程的任务
		while (true) {
			synchronized (pool) {	//以水池为锁，因为是同一个水池，所以锁唯一
				if (! pool.isFull()) {	//如果水池不是满的，则注水
					pool.waterLevel += inSpeed;	//注水速度
//					System.out.print(pool.waterLevel + "  ");
//					if (pool.waterLevel % 100 == 0) {
//						System.out.println("");
//					}
					try {
						sleep(10);		//模拟注水时间，10ms 为一秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {	//如果水池是满的，则通知放水进程放水
					System.out.println("水池满了，请放水");
//					System.out.println("正在放水...");
					pool.notify();	//唤醒放水进程
					try {
						pool.wait();//让注水进程等待
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			}
		}
	}
}

class Output extends Thread{
	public static final int outSpeed = 2;	//放水速度
	public Pool pool;	//放水的水池对象
	
	//构造函数，指定水池
	public Output(Pool pool){
		this.pool = pool;
	}
	
	@Override
	public void run() {	//定义放水进程任务
		while (true) {
			synchronized (pool) {	//以水池为锁，因为是同一个水池，所以锁唯一
				if (! pool.isEmpty()) {	//如果水池不是空的，则放水
					pool.waterLevel -= outSpeed;
//					System.out.print(pool.waterLevel + "  ");
//					if (pool.waterLevel % 50 == 0) {
//						System.out.println("");
//					}
					try {
						sleep(10);	//模拟放水时间，10ms 为 1 秒
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {	//如果水池空了，则通知注水进程注水
					System.out.println("水池空了，请注水");
//					System.out.println("正在注水...");
					pool.notify();	//唤醒注水进程
					try {
						pool.wait();//让放水进程等待
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			}
		}
	}
	
}


public class WaterPool {

	public static void main(String[] args) {
		Pool pool = new Pool();				//创建水池对象
		Input input = new Input(pool);		//创建注水进程对象
		Output output = new Output(pool);	//创建放水进程对象
		
		input.start();		//注水进程启动
		output.start();		//放水进程启动
		
	}

}
